/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package trade;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 *
 * @author Leo
 */
public class Negocio {

    private List<String> acoesDisponiveis;
    private HashMap<String, Integer> acoes;

    public Negocio()
    {
        acoes = new HashMap<String, Integer>();
        acoesDisponiveis = new ArrayList<String>();
        carregaAcoesValidas();
    }

    private void carregaAcoesValidas() {
        acoesDisponiveis.add("A");
        acoesDisponiveis.add("AA");
        acoesDisponiveis.add("ELON");
        acoesDisponiveis.add("ELP");
        acoesDisponiveis.add("GPS");
        acoesDisponiveis.add("GPX");
        acoesDisponiveis.add("MGRC");
        acoesDisponiveis.add("MGRP");
        acoesDisponiveis.add("MGS");
        acoesDisponiveis.add("XOMA");
        acoesDisponiveis.add("XOMD");
        acoesDisponiveis.add("ZRAN");
    }

    /**
     * Realiza uma transação de venda de uma determinada quantidade de um
     * determinado símbolo.
     *
     * @param acao
     * @param quantidade
     * @throws NegocioException
     */
    public void compra(String acao, Integer quantidade) throws NegocioException {
        validaAcaoDisponivel(acao);
        validaQuantidade(quantidade);

        if (acoes.containsKey(acao))
        {
            Integer quantidadeAtual = getAcoes().get(acao);
            Integer novaQuantidade = quantidadeAtual + quantidade;
            validaQuantidade(novaQuantidade);
            getAcoes().put(acao, novaQuantidade);
        }
        else
            getAcoes().put(acao, quantidade);
    }

    /**
     * Realiza uma transação de venda de uma determinada quantidade de um
     * determinado símbolo.
     *
     * @param acao
     * @param quantidade
     * @throws NegocioException
     */
    public void vende(String acao, Integer quantidade) throws NegocioException {
            validaQuantidade(quantidade);
            validaAcaoDisponivel(acao);
            validaExistenciaAcao(acao);

            Integer quantidadeAtual = getAcoes().get(acao);
            Integer novaQuantidade = quantidadeAtual - quantidade;
            validaQuantidade(novaQuantidade);

            getAcoes().put(acao, novaQuantidade);
    }

    /**
     * Verifica se a quantidade especificada é uma quantidade válida, ou seja,
     * se é maior do que 0.
     *
     * @param quantidade
     * @throws NegocioException
     */
    private void validaQuantidade(int quantidade) throws NegocioException {
        if (quantidade <= 0)
            throw new NegocioException("Quantidade deve ser maior do que 0.");
    }

    /**
     * Verifica se o símbolo especificado existe na lista de símbolos válidos.
     *
     * @param acao
     * @throws NegocioException
     */
    private void validaAcaoDisponivel(String acao) throws NegocioException {
        if (!acoesDisponiveis.contains(acao))
            throw new NegocioException("Símbolo especificado não existe.");
    }

    /**
     * Verifica se o símbolo especificado está presente no dicionário de papéis
     * já comprados.
     *
     * @param acao
     * @throws NegocioException
     */
    private void validaExistenciaAcao(String acao) throws NegocioException {
        if (!acoes.containsKey(acao))
            throw new NegocioException("Esta ação não foi comprada.");
    }

    /**
     * @return acoes
     */
    public HashMap<String, Integer> getAcoes() {
        return acoes;
    }

    /**
     * Verifica se a ação especificada se encontra na lista de ações
     *
     * @param acao
     * @return verdadeiro ou falso
     */
    public Boolean contemAcao(String acao) {
        return getAcoes().containsKey(acao);
    }

    /**
     * Retorna a quantidade de determinada ação presente na lista de ações
     *
     * @param acao
     * @return inteiro correspondente a quantidade de ações
     * @throws NegocioException
     */
    public Integer quantidadeAcao(String acao) throws NegocioException {
        validaExistenciaAcao(acao);
        return getAcoes().get(acao);
    }
}
